package org.dromara.demo.designPattern.lsp.service;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.math.BigDecimal;
import java.util.List;

//信用卡
public class CreditCard2 extends BankCard {

    private final Logger logger = LoggerFactory.getLogger(CreditCard2.class);


    /**
     * 信用卡构造函数，继承了父类BankCard的构造方法
     * @param cardNo : 卡号
     * @param cardDate : 开卡时间
     */
    public CreditCard2(String cardNo, String cardDate) {
        super(cardNo, cardDate);
    }

    boolean rule(BigDecimal amount) {
        return amount.compareTo(new BigDecimal(1000)) <= 0;
    }

    /**
     * 提现，信用卡贷款
     *
     * @param orderId 单号
     * @param amount  金额
     * @return 状态码
     */
    public String loan(String orderId, BigDecimal amount) {
        boolean rule = rule(amount);
        if (!rule) {
            logger.info("生成贷款单失败，金额超限。单号：{} 金额： {}", orderId, amount);
            return "0001";
        }
         // 模拟生成贷款单
        logger.info("生成贷款单，单号：{} 金额：{}", orderId, amount);
        // 模拟支付成功
        logger.info("贷款成功，单号：{} 金额：{}", orderId, amount);
        return super.negative(orderId, amount);
    }

    /**
     * 还款，信用卡还款
     *
     * @param orderId 单号
     * @param amount  金额
     * @return 状态码
     */

    public String repayment(String orderId, BigDecimal
            amount) {
           // 模拟生成还款单
        logger.info("生成还款单，单号：{} 金额：{}", orderId,
                amount);
          // 模拟还款成功
        logger.info("还款成功，单号：{} 金额：{}", orderId,
                amount);
        return super.positive(orderId, amount);
    }


    /**
     * 信用卡类在继承父类后，使用了公用的属性，即卡号 cardNo、开卡时间
     * cardDate，同时新增了符合信用卡功能的新方法，即贷款loan、还款
     * repayment，并在两个方法中都使用了抽象类的核心功能。
     * 另外，关于储蓄卡中的规则校验方法，新增了自己的规则方法 rule2，并没
     * 有破坏储蓄卡中的校验方法。
     * 以上的实现方式都是在遵循里氏替换原则下完成的，子类随时可以替代储蓄卡类
     */

}
